package stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo4{

    /* 映射(map/flatMap)
    就是将一个流中的元素同时干一件事，就是用到映射

    映射，可以将一个流的元素按照一定的映射规则映射到另一个流中。分为map和flatMap。
    1. map：接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素。
    2. flatMap：接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流。

     */

    public static void main(String[] args) {
        String[] arr = {"aa", "bb", "cc", "dd"};
        // 将数组中的元素转为大写 map:p
        List<String> collect = Arrays.stream(arr).map(s -> s.toUpperCase()).collect(Collectors.toList());
        System.out.println(collect);
        System.out.println("--------------------------------");
        Stream<String> stream = Stream.of("aa", "bb", "cc", "dd");
        List<String> collect1 = stream.map(s -> s.toUpperCase()).collect(Collectors.toList());
        System.out.println(collect1);
        List<String> a = Arrays.asList("a", "b", "c", "d");
        List<String> collect7 = a.stream().map(s -> s.concat(".java")).collect(Collectors.toList());
        System.out.println(collect7);

        //将所有元素转为整数
        List<String> list = Arrays.asList("1", "2", "3", "4", "5");
        List<Integer> collect2 = list.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());
        System.out.println(collect2);
        System.out.println("--------------------------------");
        // 将每个元素+3
        List<Integer> collect3 = collect2.stream().map(s -> s + 3).collect(Collectors.toList());
        System.out.println(collect3);

        //将员工的薪资全部增加1000
        // map(item -> {item.getSalary() + 1000; return item;})
        // peek(item -> {item.getSalary() + 1000;})
        // 有这两种方式，peek是中间操作，返回的是流，map是中间操作，返回的是集合
        List<Person> collect4 = Arrays.asList(
                new Person("张三", 9999.99, "北京"),
                new Person("李四", 8888.88, "上海"),
                new Person("王五", 7777.77, "广州")
        ).stream().peek(p -> {
                    p.setSalary(p.getSalary() + 1000);
                }
        ).collect(Collectors.toList());
        collect4.forEach(System.out::println);

        //将两个字符串合并成一个新的字符串 joining作用：将流中的元素连接成一个字符串
        List<String> list1 = Arrays.asList("aa", "bb");
        String collect5 = list1.stream().map(s -> s.toUpperCase()).collect(Collectors.joining(""));
        System.out.println(collect5);
        System.out.println("--------------------------------");
        //将两个字符串合并成一个新的字符串数组，flatMap作用：将流中的每个元素都映射到一个新的流，然后把所有流连接成一个流
        List<String> collect6 = list1.stream().flatMap(s -> {
            String[] split = s.split("");
            Stream<String> strea = Arrays.stream(split);
            return strea;
        }).collect(Collectors.toList());
        System.out.println(collect6);
        //合并两个流的方法是 ： Stream.concat(stream1,stream2)
    }
}
